import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart' hide MultipartFile, FormData;
import 'package:im_base/private/app_ext.dart';
import 'package:im_base/public/components/layout_widgets.dart';
import 'package:im_base/public/service/storage_service.dart';

class IMBaseController extends GetxController {
  ///为了方便统一管理,这里将状态从state中拿出来放到controller中
  LoadStatus status = LoadStatus.FINISHED;

  ///记录使用的方法
  ///1 为getData 2 为getAllData 3为getListData
  int requestType = 1;

  ///是否可以加载更多
  bool hasMore = false;
  int pageIndex = 1;
  int pageSize = 20;

  ///放置本页面添加的监听器
  final _listenerSet = <ValueSetter>{};

  dynamic get args {
    return Get.arguments;
  }

  ///结束当前页面
  void onBack() {
    Get.back();
  }

  ///结束页面[times]结束次数
  void close(int times) {
    Get.close(times);
  }

  ///返回到指定页面
  void popTo(String page) {
    Get.until(ModalRoute.withName(page));
  }

  ///直接移除页面路由
  void removeRoute(String page) {}

  ///结束当前页面
  void onBackResult<T>(T? result) {
    Get.back(result: result);
  }

  T findLogic<T>({String? tag}) {
    return Get.find<T>(tag: tag);
  }

  bool isRegister<T>({String? tag}) {
    return Get.isRegistered<T>(tag: tag);
  }

  ///加载中
  void loading() {
    status = LoadStatus.LOADING;
  }

  void loadFinish() {
    status = LoadStatus.FINISHED;
  }

  void loadEmpty() {
    status = LoadStatus.EMPTY;
  }

  void loadError() {
    status = LoadStatus.ERROR;
  }

  Future<void> loadData() async {}


  ///刷新数据
  Future<void> onRefresh() async {
    pageIndex = 1;
    await loadData();
    return Future.value(true);
  }

  ///加载更多,如果没有更多,则不做处理
  void loadMoreData() {
    if (!hasMore) {
      return;
    }
    pageIndex++;
    loadData();
  }

  @override
  void onClose() {
    _cleanListeners();
    super.onClose();
  }

  ///添加监听器,同时将改监听器放到Set集合中
  void addKeyListener(String key,ValueSetter listener){
    _listenerSet.add(listener);
    watchIMData(key, listener);
  }

  ///在页面结束的时候移除本页面添加的监听器,防止消息重复通知
  void _cleanListeners() {
    StorageService.instance.removeListenerList(_listenerSet);
  }

}
